﻿/*
 * zstring.h
 *
 *  Created on: 2015年4月3日
 *      Author: Fifi Lyu
 */

#ifndef INCLUDE_ZPSOE_ZALGORITHM_ZSTRING_H_
#define INCLUDE_ZPSOE_ZALGORITHM_ZSTRING_H_

#include "zpsoe/common.h"
#include <map>
#include <sstream>
#include <vector>

using std::map;
using std::stringstream;
using std::vector;

namespace zpsoe {

namespace zalgorithm {

namespace zstring {
// 在字符串str中，查找子字符串sub_str
ZPSOE_SHARED_LIB_API bool find(const string &str, const string &sub_str);

// 去除首位的空白字符
ZPSOE_SHARED_LIB_API string trim(
        const string &s, const string &white_space = " ");

// 将字符串中的大写字母转换为小写
ZPSOE_SHARED_LIB_API string to_lower(const string &s);

// 将字符串中的小写字母转换为大写
ZPSOE_SHARED_LIB_API string to_upper(const string &s);

// 替换字符串中所有指定的子字符串
ZPSOE_SHARED_LIB_API string replace(
    const string& str, const string& old_substr, const string& new_substr);

// 删除字符串中指定的子字符串
ZPSOE_SHARED_LIB_API string erase(const string &str, const string &sub_str);

// 判断字符串是否是版本号码
ZPSOE_SHARED_LIB_API bool is_version(const string &str);

// 判断字符串是否是全数字组成
ZPSOE_SHARED_LIB_API bool is_digit(const string &str);

// 判断字符串是否是字母和数字组成
ZPSOE_SHARED_LIB_API bool is_alnum(const string &str);

// 判断字符串是否是字母组成
ZPSOE_SHARED_LIB_API bool is_alpha(const string &str);

// 字符串转换为 int(仅仅支持十进制) double float bool 等指定类型
template <class T>
T string_cast(const string &s) {
    T v_;
    stringstream ss_(s);
    ss_ >> v_;
    return v_;
}

// 转换为字符串
// 如果是数字，仅仅支持十进制数字转换。
template <class T>
string to_str(const T &v) {
    stringstream ss_;
    ss_ << v;
    return ss_.str();
}

// sep可以是多个分隔符，会按照多分隔符同时分隔
// \n 以 "." 分隔，结果是 {"", ""}
// www.abc.com 以 "." 分隔，结果是 {"www", "abc", "com"}
// www.abc+com. 以 ".+" 分隔，结果是 {"www", "abc", "com", ""}
ZPSOE_SHARED_LIB_API void to_vector(
        const string &s, vector<string> &v, const string &sep = "\n");

// 列表转化为map，key=列表值，value=""
ZPSOE_SHARED_LIB_API void to_map(const vector<string> &v, map<string, string> &m);

/*
    将字符串按分隔符分割，填充到map中
    比如，以\n分割
    a\n
    b\n
    c\n

    map[a]=""
    map[b]=""
    map[c]=""
*/
ZPSOE_SHARED_LIB_API void to_map(
        const string &s, map<string, string> &m, const string &sep = "\n");

} /* namespace zstring */

} /* namespace zalgorithm */

} /* namespace zpsoe */

#endif /* INCLUDE_ZPSOE_ZALGORITHM_ZSTRING_H_ */
